package com.lqk.demo.designpatterns.terminationmode.twostagetermination;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * @author lqk
 * @date 2021/12/26 16:02
 *
 * 两阶段终止模式
 *  在一个线程 T1 中如何“优雅”终止线程 T2？这里的【优雅】指的是给 T2 一个料理后事的机会。
 *  interrupted 方式
 */
@Slf4j
public class TestInterrupted {
    public static void main(String[] args) throws InterruptedException {
        TwoPhaseTermination tpt = new TwoPhaseTermination();
        tpt.start();
        TimeUnit.MILLISECONDS.sleep(3500);
        tpt.stop();
    }
}

@Slf4j
class TwoPhaseTermination{
    private Thread monitor;

    // 启动监控线程
    public void start(){
        monitor = new Thread(()->{
            while (true){
                Thread currentThread = Thread.currentThread();
                if (currentThread.isInterrupted()){
                    log.debug("料理后事");
                    break;
                }
                try {
                    // 睡眠 1 秒
                    TimeUnit.SECONDS.sleep(1);  // 第一种情况被打断，打断正在睡眠的线程，被打断后会清空打断标记，重新置为false
                    log.debug("执行监控记录");    // 第二种情况被打断，打断正常运行的线程, 不会清空打断状态，打断状态设置为true
                } catch (InterruptedException e) {
                    // 重新设置打断标记为true
                    currentThread.interrupt();
                }
            }
        });
        monitor.start();
    }

    // 停止监控线程
    public void stop(){
        // 打断监控线程
        monitor.interrupt();
    }

}
